package cn.com.bluemoon.daps.sync.base;

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.Map;

import static org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString;
import static org.apache.commons.lang3.builder.ToStringStyle.MULTI_LINE_STYLE;

/**
 * 结果采集
 *
 * @author Jarod.Kong
 * @date 2021/1/14 9:18
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class CompareResult<T> {
    /**
     * DevModelCompareVo / SqlCompareResult ...etc
     */
    private T data;

    private String modelName;

    private String modelId;

    private String dbName;

    /**
     * 可能为空，因为存在数据库中有而模型中没有的表
     * <p>
     * 表id 基于模型->dev/test的情况，模型表都会有表id
     * 基于dev/test->模型的情况，（模型无，库表有）没有表id，有表名；此时为删除库表信息，<important>但是目前业务路基
     * 是不允许进行删除库表的，所以表id还是不为空</important>
     */
    private String tableId;

    /**
     * 变更类型
     */
    private ModifyType modifyType;
    /**
     * 变更所属级别
     */
    private ModifyType.ModifyLevel modifyLevel;

    /**
     * 表名 基于模型->dev/test的情况，模型表都会有表名
     * 基于dev/test->模型的情况，都有表名
     */
    @ApiModelProperty("表名")
    private String tableName;

    @ApiModelProperty("差异内容")
    private Map<String, List<Object>> desc;

    /**
     * 高危语句
     */
    @ApiModelProperty("是否为高危语句")
    private boolean highDangerStats;

    @ApiModelProperty("建表语句，只拿同步环境库表中存在的表语句，同步执行前的语句")
    private String tableCreateSql;

    @Override
    public String toString() {
        return reflectionToString(this, MULTI_LINE_STYLE);
    }
}
